home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / cuj0593.zip / 1105058A < prev    next >
Text File  |  1993-03-16  |  4KB  |  198 lines

  1. // main.cpp  - Frog Pond Listing 3
  2. #include <frog.h>
  3.  
  4. main()
  5.     {
  6.     PMF_VV pf = &Creature::move;  // bound to a virtual
  7.     Pond walden;
  8.     Creature *p1;
  9.     Creature *p2;
  10.  
  11.     p1 = Creature::newCreature(Tadpole("Wiggly") );
  12.     walden.insert(p1);
  13.     p2 = Creature::newCreature(Bullfrog("Croaker") );
  14.     walden.insert(p2);
  15.  
  16.     cout << "First time -------------------\n";
  17.     walden.activate( pf );  // Tell all creatures to move
  18.     cout << "second time ------------------\n";
  19.     walden.activate( pf );  // Tell all creatures to move
  20.     cout << "third time -------------------\n";
  21.     walden.activate( pf );  // Tell all creatures to move
  22.  
  23.     return 0;
  24.     }
  25.  
  26. First time -------------------
  27. WigglyAge 1 Swimming jerkily
  28. Croaker - I'm jumping
  29. second time ------------------
  30. Wiggly Age 2 Swimming jerkily still, but changing into Bullfrog
  31. Croaker - I'm jumping
  32. third time -------------------
  33. Wiggly - I'm jumping
  34. Croaker - I'm jumping
  35. //  Frog.h
  36. #ifndef FROG_H
  37. #define FROG_H
  38. #include <iostream.h>
  39. #include <rw/gslist.h>
  40.  
  41. class Creature
  42.     {
  43. public:
  44.     Creature(Creature *ptr);
  45.     Creature(const Creature &c) : object(c.object) {}
  46.     virtual void move();
  47.     virtual Creature *clone() const;
  48.     static Creature *newCreature(const Creature&);
  49.     virtual const char *getname() const
  50.         {return object->getname(); }
  51.     virtual ~Creature();
  52. //    void change(Creature *c);
  53. protected:
  54.     Creature() { object = 0; }  // invoked by derived
  55.     Creature *object;
  56.     static Creature *altered;
  57.     };
  58.  
  59. declare(GSlist,Creature)
  60.  
  61. class Frog : public Creature
  62.     {
  63. protected:
  64.     const char *name;
  65. public:
  66.     Frog(const char *p);
  67.     Frog(const Frog &f);
  68.     ~Frog(); 
  69.     virtual void move() = 0;
  70.     virtual const char *getname() const { return name; }
  71.     Creature * clone() const;
  72.     };
  73.  
  74. class Tadpole : public Frog
  75.     {
  76.     int age;
  77. public:
  78.     Tadpole(const char *name = "Noname Tadpole");
  79.     void move();
  80.     Tadpole(const Tadpole& t) : Frog(t), age(t.age) { }
  81.          // invoke Frog copy ctor
  82.     Creature * clone() const;
  83.     };
  84.  
  85. class Bullfrog : public Frog
  86.     {
  87. public:
  88.     Bullfrog(const char *name="Noname frog");
  89.     Bullfrog(const Bullfrog &b) : Frog(b) {}
  90.     void move() { cout << name << " - I'm jumping\n"; }
  91.     Creature * clone() const { return new Bullfrog(*this); }
  92.  
  93. class Pond
  94.     {
  95.     GSlist(Creature) list;  // singly linked creature list
  96. public:
  97.     void activate( void (Creature::*pf) () );
  98.     void insert(Creature*);
  99.     };
  100.  
  101. typedef void (Creature::*PMF_VV)();  
  102. #endif
  103. // Frog.cpp
  104. #include <stdlib.h>
  105. #include <frog.h>
  106. #include <string.h>
  107.  
  108. Creature *Creature::altered = 0;  // private static data
  109. void Pond::insert(Creature *f)
  110.     {
  111.     list.insert(f);
  112.     }
  113.  
  114. void Pond::activate( PMF_VV pmf_vv )
  115.     {
  116.     GSlistIterator(Creature) it(list);
  117.     Creature *resident;
  118.     while ( resident = (Creature *)it() )
  119.     {
  120.     (resident->*pmf_vv)();  
  121.     }
  122.     }
  123.  
  124. Creature *Creature::newCreature(const Creature& prototype)
  125.     {
  126.     Creature *C = new Creature(prototype.clone());
  127.     // we must return an envelope, clone just makes a letter
  128.     return C;
  129.     }
  130.  
  131.  
  132. Creature * Tadpole::clone() const
  133.     {
  134.     Tadpole *t = new Tadpole(*this); // Tadpole copy ctor
  135.     return t;
  136.     }
  137.  
  138. Creature::Creature(Creature *objptr)  
  139.     {
  140.     object = objptr;  
  141.     }
  142.  
  143. Creature::~Creature() { }
  144.  
  145. Creature *Creature::clone() const
  146.      {
  147.      Creature *p = object->clone();
  148.      Creature *envelope = new Creature(p);
  149.      return envelope;
  150.      }
  151.  
  152. void Creature::move()
  153.     {
  154.     object->move();
  155.     if ( altered )
  156.     {
  157.     delete object;
  158.     object = altered;
  159.     altered = 0;
  160.     }
  161.     }
  162.  
  163. Creature * Frog::clone() const  // never get here
  164.     {
  165.     return 0;
  166.     }
  167.  
  168. Frog::Frog(const char *n) : name(n) { }
  169.  
  170. Frog::Frog(const Frog &f) : Creature(f), name (f.getname())
  171.     {
  172.     }
  173.     
  174. Tadpole::Tadpole(const char *n) : Frog(n),age(0) 
  175.     {
  176.     }
  177.  
  178. Bullfrog::Bullfrog(const char *n) : Frog(n) 
  179.     {
  180.     }
  181.  
  182. void Tadpole::move() 
  183.     {
  184.     age++;
  185.     if ( age < 2 )
  186.     cout << name << "Age " << age << " Swimming jerkily\n";
  187.     else
  188.         {
  189.     cout << name << " Age " << age << 
  190.          " Swimming jerkily still, but changing into Bullfrog\n";
  191.     Creature *f=Creature::newCreature(Bullfrog(name));
  192.     Creature::altered = f;
  193.     }
  194.     }
  195.  
  196. Frog::~Frog() { }
  197.  
  198.